# coding=utf-8
import SimpleHTTPServer
import BaseHTTPServer
import sys
import cgi
import urllib
import Lab2analyse

# INF 8007 lab 2 - Mikaël Guillemot et Thibaut Stimpfling 
# Ce fichier est le point d'entre de l'application lab2
#
# Apres avoir observe BaseHTTPServer et SimpleHTTPServer et les exemples fourni,
# nous avons constater que le serveur que nous voulions implementer dans le
# cadre du lab2 etait presque entierement disponible. Le plus long aura ete
# d'apprendre a se servir de l'existant et de l'heritage.
# notre travail ici consiste a implementer la lethose do_POST. On reutilise 
# SimpleHTTPRequestHandler pour le reste. 
#
# NOTE : Ce serveur n'est absolument PAS securise ! 


class localHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
    analyser = None
    
    def do_POST(self):
        global rootnode
        try:
            # on recupere les informations contenu dans l'entete http
            ctype, pdict = cgi.parse_header(self.headers.getheader('content-type'))
            # apres avoir verifier le contenu du formulaire (enctype = multipart/form-data)...
            if ctype == 'multipart/form-data':
                # on recupere le dico des balises du formulaire (c'est a ce moment que le fichier est chargé)
                form = cgi.parse_multipart(self.rfile, pdict)
            # si il n'y a pas d'exception on confirme la reception du post
            self.send_response(301)
            self.end_headers()
            
            #on verifie quelle type de donnee nous avons
            #cela fonctionne meme si le javascript est desactive.
            #le javascript est present  uniquement pour ameliorer l'ergonomie
            radio = form.get('radiogrp')
            # on recupere les donnees en fonction de leur type
            if radio[0] == 'text':
                data = form.get('uptext')[0]
            elif radio[0] == 'url':
                url = form.get('upurl')[0]
                try :
                    ext_url = urllib.urlopen(url)
                    data = ext_url.read()
                except :
                    print "erreur lors de la tentative get sur l'url: " + url
                    self.wfile.write("<HTML><a href=""> retour </a><br><h2>URL introuvable. " + url + "</h2>")
                    raise #on passe le reste du traitement
              
            elif radio[0] == 'file':
                data = form.get('upfile')[0]
            print "donnees a traiter (type de passage : " + radio[0] + "):"
            print data

            #on les analyses
            result = analyser.process(data)
            #on genere la page de retour
            self.wfile.write("<HTML><a href=""> retour </a> <br> <b>Resultat de l'analyse :</b></BR>")
            self.wfile.write(result)
            self.wfile.write("</HTML>")
            
        except :
            pass


    def do_GET(self):
        #on redirige la page par defaut : cette partie  est discutable, si l'on veu rester generique
        # la bonne methode est d'utiliser un fichier index.htm ou .html
        if self.path == "/":
            self.path = "/analyseur.html"
        SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self)



def start(HandlerClass=localHTTPRequestHandler,
         ServerClass=BaseHTTPServer.HTTPServer):
    BaseHTTPServer.test(HandlerClass, ServerClass)


# point d'entrée de l'application : on regle le port d'ecoute (attendu comme
# parametre par le serveur) et on initialise le dictionnaire
if __name__ == '__main__':
    sys.argv = ['', 8080]
    print "démarrage du serveur, creation du dictionnaire ..."
    analyser = Lab2analyse.analyse()
    if analyser.dictionnaire_init():
        start()
        
